package com.fulihui.information.api;

import com.fulihui.information.dto.ContentDTO;
import com.fulihui.information.dto.ContentListItemDTO;
import com.fulihui.information.request.*;
import org.near.servicesupport.result.BaseResult;
import org.near.servicesupport.result.TPageResult;
import org.near.servicesupport.result.TSingleResult;

/**
 * 内容服务
 *
 * @author Willard.Hu on 2016/12/26 0026.
 */
public interface ContentService {

    /**
     * 批量修改资讯状态
     *
     * @param request {@link ContentBatchModifyStatusRequest}
     * @return {@link BaseResult}
     */
    BaseResult batchModifyStatus(ContentBatchModifyStatusRequest request);

    /**
     * 置顶内容，每个类目只能置顶一个
     *
     * @param request {@link ContentIdRequest}
     * @return {@link BaseResult}
     */
    BaseResult top(ContentTopRequest request);

    /**
     * 资讯修改
     *
     * @param request {@link ModifyContentRequest}
     * @return {@link BaseResult}
     */
    BaseResult modifyContent(ModifyContentRequest request);

    /**
     * 普通分页查询资讯内容
     *
     * @param request {@link ContentPageQueryRequest}
     * @return {@link ContentDTO} 列表内容，{@link TPageResult} 分页信息
     */
    TPageResult<ContentDTO> queryPage(ContentPageQueryRequest request);

    /**
     * 获取内容详情
     *
     * @param request {@link ContentIdRequest}
     * @return {@link ContentDTO}
     */
    TSingleResult<ContentDTO> detail(ContentIdRequest request);

    /**
     * 提供给 APP 使用的分页方式
     * <ul>
     * <li>如果使用有序的排序方式(EDataObtainType.ORDERLY)，会按热度分从高到地排序。翻页时，需要将最后一个元素的
     * code 存入 lastQueries 进行查询。</li>
     * <li>如果使用随机排序方式(EDataObtainType.RANDOM)，分页内容分为N页前和N页后，N页前，在热度最高的M条数据中
     * 随机获取，N页后，在剩余的数据中随机查找，需要过滤的已查询内容存入 lastQueries 进行排重复，建议此列表中的数量
     * 不要过多，否则会非常耗时，在允许的范围内，过滤排重复的数据。N * rows * 3 < M </li>
     * </ul>
     * 第一页内容会自动加上置顶的数据。
     *
     * @param request {@link ContentPageQueryForAppRequest}
     * @return {@link ContentListItemDTO} 列表，{@link TPageResult} 分页信息
     * @see com.fulihui.information.enums.EDataObtainType
     */
    TPageResult<ContentListItemDTO> queryPageForApp(ContentPageQueryForAppRequest request);

    /**
     * 获取内容评论次数
     * @param request {@link ContentIdRequest}
     * @return 数量值
     */
    TSingleResult<Long> conetntCommentTimes(ContentIdRequest request);
}
